package com.learn.redis.second;

import jodd.datetime.TimeUtil;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.spring.cache.RedissonSpringCacheManager;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Second {
//    private Jedis jedis = new Jedis("127.0.0.1", 6387);
//
//    public static void main(String[] args) {
//        String redisKey = "lock";
//        ExecutorService executorService = Executors.newFixedThreadPool(20);
//        Jedis jedis = new Jedis("127.0.0.1", 6387);
//        jedis.set(redisKey, "0");
//        jedis.close();
//
//        for (int i = 0; i < 1000; i++) {
//            executorService.execute(() -> {
//
//                Jedis jedis1 = new Jedis("127.0.0.1", 6387);
//                try {
//                    jedis1.watch(redisKey);
//                    String redisValue = jedis1.get(redisKey);
//                    int valueInteger = Integer.valueOf(redisValue);
//                    String userInfo = UUID.randomUUID().toString();
//                    //没秒玩
//                    if (valueInteger < 20) {
//                        //开启事务
//                        Transaction tx = jedis1.multi();
//                        tx.incr(redisKey);//增加1
//                        List<Object> list = tx.exec();
//                        if (list != null && list.size() > 0) {
//                            System.out.printf("秒杀成功");
//                        } else {
//                            System.out.printf("秒杀失败");
//                        }
//
//                    } else {
//                        System.out.printf("秒玩了");
//                    }
//
//                } catch (Exception e) {
//                    e.printStackTrace();
//                } finally {
//                    jedis1.close();
//                }
//            });
//        }
//        executorService.shutdown();
//
//
//    }
//
//    /**
//     * redis set NX命令实现分布式锁
//     *
//     * @param lockkey    可以就是锁
//     * @param requestId  请求ID 保证同一性 uuid+threadId
//     * @param expireTime 过期时间
//     * @return
//     */
//    public boolean getLock(String lockkey, String requestId, int expireTime) {
//        //NX :保证互斥性
//        //hset 原子操作 只要 lockkey 有效 则说明有进程使用分布式锁
//        String result = jedis.set(lockkey, requestId, "NX", "EX", expireTime);
//        if (result.equals("ok")) {
//            return true;
//        }
//        return false;
//
//
//    }
//
//    /**
//     * 释放锁 不推荐
//     * @param lockkey
//     * @param requestId
//     */
//    public void releaseLock(String lockkey,String requestId){
//        if(requestId.equals(jedis.get(lockkey))){
//            jedis.del(lockkey);
//        }
//    }
//
//    /**
//     * 通过lua 脚本进行释放
//     * @param lockkey
//     * @param requestId
//     * @return
//     */
//    public boolean releaseLock1(String lockkey,String requestId){
//        String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else retrun 0 end";
//        List<String > a1 =new ArrayList<>();
//        a1.add(lockkey);
//        List<String > a2 =new ArrayList<>();
//        a1.add(requestId);
//        Object result=  jedis.eval(script, a1,a2);
//
//        if(result.equals(1L)){
//            return  true;
//        }
//        return  false;
//    }
//
//
//    public boolean acquire(String lockName){
//        RedissonClient redissonClient = Redisson.create(null);
//
//        String key = "redisLock_" + lockName;
//        RLock lock = redissonClient.getLock(key);
//        //设置有效时间3秒
//        lock.lock(3, TimeUnit.SECONDS);
//        return  true;
//    }
//
//    /**
//     * 释放锁
//     * @param lockName
//     */
//    public void release(String lockName){
//        RedissonClient redissonClient = Redisson.create(null);
//
//        String key = "redisLock_" + lockName;
//        RLock lock = redissonClient.getLock(key);
//        lock.unlock();
//    }
//
//














}
